(function(factory) {
	if(typeof define === "function" && define.amd) {
		// AMD. Register as an anonymous module.
		define(factory);
	} else {
		// Browser globals
		factory();
	}
}(function() {
	/***
	 * 桌面应用分组
	 * 在HteOS.app.AppManager.load方法中，应用管理器根据获取的数据自动创建分组
	 * 
	 *	   	//创建分组
	 *		for(var i = 0; i < groups.length; i++){
	 *			me.createGroup(groups[i]);
	 *		}
	 * 
	 *  创建分组的方法：HteOS.app.AppManager.createGroup
	 *  应用管理器初始化所有应用和分组后触发事件hte.apps.initialized，HteOS.Metro.init方法中捕获该事件，并将分组渲染到桌面的容器中
	 * 
	 * 	HteOS.EventManager.on("hte.apps.initialized",function(){
	 *			metro.render();
	 *		});
	 * 
	 * 分组组件可以添加应用、删除应用、修改分组名称，拖拽排序等功能。
	 * 
	 * @class HteOS.app.Group
	 * */
	var Group = HteOS.app.Group = function(options) {
		var group = this;
		/**
		 * @cfg 分组ID
		 * @type {String}
		 * */
		group.id = options.id;
		/**
		 * @cfg 分组名称
		 * @type {String}
		 * */
		group.name = options.name;
		/**
		 * @cfg 分组位置
		 * @type {Number}
		 * */
		group.index = options.index;
		/**
		 * @property 分组下的所有应用
		 * @type {Object}
		 * 分组应用列表的格式为key/value的数据格式
		 * */
		this.apps = {};
		/**
		 * @property 分组下的所有应用的ID
		 * @type {Array}
		 * */
		this.keys = [];
		this.initialized = true;
	};

	/**
	 * @private
	 * 渲染分组到容器中，创建分组的DOM，并将分组下的所有应用渲染到分组的DOM中。
	 * 创建分组名称编辑组件，并开启分组拖拽组件
	 * @param {Object}
	 * */
	Group.prototype.collect = function(container) {
		var apps = this.apps;
		if(apps) {
			var array = [];
			for(var id in apps) {
				array.push(apps[id]);
			}
			array.sort(function(a, b) {
				if(a.index > b.index) {
					return 1;
				}
				return -1;
			});
			this.keys = [];
			for(var i = 0; i < array.length; i++) {
				var app = array[i];
				this.keys.push(app.id);
			}
		}
	};
	
	/**
	 * 设置分组名称，设置成功后触发名称更改事件
	 * @param {String} name
	 * */
	Group.prototype.setName = function(name) {
		if(name && name != this.name) {
			var oldName = this.name;
			this.name = name;
			/**
			 * 触发应用名称发生更改事件
			 * @event hte-group-rename
			 * @param {HteOS.app.Group} group
			 * @param {String} oldName
			 * @param {String} newName
			 * */
			HteOS.EventManager.trigger("hte.group.rename", this, oldName, this.name);
		}
	};

	/**
	 * @private 销毁分组，并将分组的DOM删除
	 * */
	Group.prototype.destroy = function() {
		/**
		 * @event hte-group-detroy 分组销毁事件
		 * @param {HteOS.app.Group} group
		 * */
		HteOS.EventManager.trigger('hte.group.destroy', this);
	};

	/**
	 * 添加App，调用insert方法，插入应用到最后面  HteOS.app.Group.insert
	 * @param {HteOS.app.App} app
	 * */
	Group.prototype.add = function(app) {
		this.insert(app);
	};

	/**
	 * 删除App，删除之后会触发分组app发生变化的事件
	 * <p>这个操作不会删除App，只是将App的信息在Group移除，如果需要删除App可以通过HteOS.app.App.uninstall来卸载应用</p>
	 * */
	Group.prototype.remove = function(app) {
		delete this.apps[app.id];
		this.keys.remove(app.id);
		if(this.length() == 0) {
			this.destroy();
		} else {
			/**
			 * 插入成功之后触发分组内的app发生变化的事件
			 * @event hte-groups-apps-change
			 * @param {HteOS.app.Group} group
			 * */
			HteOS.EventManager.trigger("hte.group.apps.change", this);
		}
	};

	/**
	 * 获取App在分组中的位置
	 * @param {HteOS.app.App} app
	 * @return {Number} 应用的位置
	 * */
	Group.prototype.indexOf = function(app) {
		return this.keys.indexOf(app.id);
	};

	/**
	 * 通过位置获取App
	 * @param {Number} index
	 * @return {HteOS.app.App} 指定位置的应用
	 **/
	Group.prototype.getAt = function(index) {
		return this.apps[this.keys[index]];
	};

	/**
	 * 获取分组中应用的数量
	 * @return {Number} 应用的数量
	 * */
	Group.prototype.length = function() {
		return this.keys.length;
	};
	
	/**
	 * 获取分组中最后一个App
	 * @return {HteOS.app.App} 最后一个App
	 **/
	Group.prototype.last = function(){
		return this.getAt(this.keys.length - 1);
	};

	/**
	 * 获取分组中第一个App
	 * @return {HteOS.app.App} 第一个App
	 **/
	Group.prototype.first = function(){
		return this.getAt(0);
	};

	/**
	 * 添加到App到指定的位置，如果没有制定位置则默认插入到最后面，并对App的DOM进行位置调整
	 * 添加成功之后如果分组已经渲染则会触发hte-group-apps-change事件
	 * @param {HteOS.app.App} app 要添加的应用
	 * @param {Number} index 指定添加的位置
	 * */
	Group.prototype.insert = function(app, index) {
		if(index === undefined) {
			index = this.keys.length;
		}
		if(app.group != this){
			app.moveTo(this);
		}else{
			this.keys.remove(app.id);
		}
		/*if(this.rendered === true) {
			var el = this.el,
				appEl = app.render();
			if(index == 0) {
				appEl.insertAfter(el.find(".hte-metro-group-title "));
			} else if(index < this.length()) {
				var target = this.getAt(index);
				appEl.insertBefore(target.getEl());
			} else {
				appEl.appendTo(el);
			}
		}*/
		this.apps[app.id] = app;
		this.keys.insert(app.id, index);
		HteOS.EventManager.trigger("hte.group.app.insert",this,app,index);
		if(this.rendered === true){
			/**
			 * 插入成功之后触发分组内的app发生变化的事件
			 * @event hte-groups-apps-change
			 * @param {HteOS.app.Group} group
			 * */
			HteOS.EventManager.trigger("hte.group.apps.change", this);
		}
	};
}));